from django.shortcuts import render
from django.db import models
from django.contrib.auth.models import AbstractUser
from apps.users.models import User
from django import http
import logging,json,re

# 日志输出器
logger = logging.getLogger('django')
# 日志输出器
from django.views import View
import json
from django.contrib.auth import login,authenticate

class RegisterView(View):
    # POST用户注册http://www.meiduo.site:8000/register/

    def post(self,request):
    # 实现注册逻辑
    # ----接受参数----json数据、json_org是json原始数据，request.body，转换成字典模式
    # 从轻球体中获取原始json数据，bytes类型的
    #     json_org = request.body
    #     json_str = json_org.decode()
    #     json_dict = json.loads(json_str)

        json_dict = json.loads(request.body.decode())


        # --------------------------------------提取参数-----------------------------------------

        username = json_dict.get('username')
        password = json_dict.get('password')
        password2 = json_dict.get('password2')
        mobile = json_dict.get('mobile')
        # 手机号
        allow = json_dict.get('allow')
        # 是否同意用户协议



        # ----------------------------校验参数-----------------------------------------
        # 判断是否都是必传参数
        # 判断用户名是否满足格式
        # 判断密码是否满足格式
        # 判断两次密码是否一致
        # 判断手机号位数
        # 判断是否同意协议
        # all()判断是否有为空的数据
        # all里面要传列表

        # 判断是否都是必传参数
        if not all([username,password,password2,mobile,allow]):

            return http.JsonResponse({'code':400,'errmsg':'缺少必传参数'})
            # 返回的数据是字典{}

        # 判断用户名是否满足格式要求（使用正则）
        if not re.match(r'^[a-zA-Z0-9]{5,20}$',username):
            # 正则判断需要使用re模式，导入re模块
            return http.JsonResponse({'code':400,'errmsg':'缺少必传参数'})
            # not取反，所有参数校验都是取反

        # 判断密码是否满足各式
        if not re.match(r'^[a-zA-Z0-9]{8,20}$',password):
            return http.JsonResponse({'code':400,'errmsg':'密码格式有问题'})

        # 判断两次密码是否一致
        if password != password2:
            # 不等于 ！=
            return http.JsonResponse({'code':400,'errmsg':'两次密码不一致'})

        # 判断手机号是否有问题
        if not re.match(r'^1[3-9]/d{9}$',mobile):

            return http.JsonResponse({'code':400,'errmsg':'手机号有问题'})

        # 判断是否同意协议
        if allow != True:

            return http.JsonResponse({'code':400,'errmsg':'未同意协议'})


# -----------------------------------实现核心逻辑：保存注册数据到用户表------------------------------------------------

        try:
            user = User.objects.create_user(username=username,password=password,mobile=mobile)
        except Exception as e:
            logger.error(e)

            return http.JsonResponse({'code':400,'errmsg':'注册失败'})


# ---------------------------------------实现状态保持，注册成功即登陆成功----------------------------------------------

    # 记住当前用户登陆状态，cookie机制（不选），session机制（ok）
    # 如何证明当前用户登录过，选择session机制，包含记录登录状态，校验登录状态
    # # login()用于实现状态保持
    # login('请求对象','注册后的用户')
        login(request,user)






# -------------------------------------响应结果，如果注册成功，推送到首页---------------------------
        return http.JsonResponse({'code':400,'errmsg':'注册成功'})













class UsernameCountView(View):

#     # 判断用户名是否重复注册
#     # GET/username/sxy/count/
    def get(self,request,username):
        try:

            count  = User.objects.filter(username = username).count()

        except Exception as e:

            logger.error(e)

            return http.JsonResponse({'code': '400', 'errmsg': '数据有问题'})

        return http.JsonResponse({'code':'0','errmsg':'ok','count':'count'})


#